package org.example.handler;

import io.micrometer.common.util.StringUtils;
import org.redisson.api.NameMapper;

/**
 * 基于redisson，redis缓存key前缀处理
 *
 * @author huhao
 */
public class KeyPrefixHandler implements NameMapper {

    private final String keyPrefix;

    /**
     * 构造函数，用于创建 KeyPrefixHandler 实例。
     *
     * @param keyPrefix 键前缀字符串。如果为空或仅包含空白字符，则使用空字符串作为前缀；否则，使用 keyPrefix 字符串后加上冒号 (":") 作为前缀。
     */
    public KeyPrefixHandler(String keyPrefix) {
        // 判断前缀是否为空或仅包含空白字符
        // 如果前缀为空或仅包含空白字符，则返回空前缀
        // 前缀为空 则返回空前缀
        this.keyPrefix = StringUtils.isBlank(keyPrefix) ? "" : keyPrefix + ":";
    }


    /**
     * 增加前缀
     *
     * @param name 待添加前缀的字符串
     * @return 如果keyPrefix不为空且name不以keyPrefix开头，则返回keyPrefix+name；否则返回原字符串。如果name为空或仅包含空白字符，则返回null。
     */
    @Override
    public String map(String name) {
        // 判断name是否为空或仅包含空白字符
        if (StringUtils.isBlank(name)) {
            // 如果name为空或仅包含空白字符，则返回null
            return null;
        }
        // 检查keyPrefix 是否不为空，并且是否不以 keyPrefix 开头。如果是，方法将keyPrefx添加到name
        // 检查keyPrefix是否不为空
        if (StringUtils.isNotBlank(keyPrefix) && !name.startsWith(keyPrefix)) {
            // 如果keyPrefix不为空且name不以keyPrefix开头，则返回keyPrefix+name
            return keyPrefix + name;
        }
        // 如果keyPrefix为空或name以keyPrefix开头，则返回原字符串
        return name;
    }

    /**
     * 去除前缀
     *
     * @param name 待去除前缀的字符串
     * @return 如果字符串以keyPrefix开头，则返回去除keyPrefix后的字符串；否则返回原字符串。如果字符串为空或仅包含空白字符，则返回null。
     */
    @Override
    public String unmap(String name) {
        // 如果字符串为空或仅包含空白字符
        if (StringUtils.isBlank(name)) {
            // 返回null
            return null;
        }
        // 如果keyPrefix不为空且字符串以keyPrefix开头
        if (StringUtils.isNotBlank(keyPrefix) && name.startsWith(keyPrefix)) {
            // 返回去除keyPrefix后的字符串
            return name.substring(keyPrefix.length());
        }
        // 如果不满足上述条件，则返回原字符串
        return name;
    }

}
